<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>


<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="../rurple.css" type="text/css"><title>Fractions - part 3</title></head><body>
<h2 class="title">Fractions - 3e partie<br></h2>

<p>Avez-vous trouvé la ligne de code redondante dans la leçon
précédente ? Juste au cas où, c'était la ligne 22. Nous demandions à
Python de simplifier deux entiers avant de retourner un nouvel objet <tt>Fraction</tt>. Cependant, en appelant <tt>Fraction()</tt>,
nous demandions automatiquement à Python de simplifier les paramètres
[ligne 10]. Nous voulons garder la ligne 10, puisqu'elle donne le
résultat requis pour notre test en ligne 43 ; donc nous pouvons
éliminer l'appel à <tt>simplifier()</tt> en line
22.</p>

<p>Maintenant, nous sommes prêts à ajouter une méthode de division.
Pour diviser deux fractions, nous multiplions la première fraction par
l'<i>inverse multiplicatif</i> de la
seconde. Quelque chose comme ceci :</p>


<pre>1   3     1   4     4     2<br>- / -  =  - * -  =  -  =  -<br>2   4     2   3     6     3<br></pre>

<p>L'inverse multiplicatif d'une fraction est obtenu en interchangeant
le numérateur avec le dénominateur ("basculant" la fraction sens dessus
dessous). Voyons comment faire cela avec Python.</p>

<!--=============================================-->
<hr width="50%">
<h3 class="section">Diviser deux fractions</h3>

<p>Pour que Python comprenne qu'utiliser le symbole "<tt>/</tt>"
entre deux fractions signifie que nous voulons diviser ces deux fractions, nous faisons la définition appropriée de la fonction <tt>__div__()</tt>. Voici les parties correspondantes de notre nouveau code :</p>

<pre><span class="linenumber">  8 </span><span class="keyword">class</span> Fraction(object):<br><span class="linenumber">  9 </span>    <span class="keyword">def</span> __init__(self, numerateur, denominateur=<span class="number">1</span>):<br><span class="linenumber"> 10 </span>        num, denom = self.simplifier(numerateur, denominateur)<br><span class="linenumber"> 11 </span>        self.num = num<br><span class="linenumber"> 12 </span>        self.denom = denom<br><br><span class="newlinenumber"> 24 </span>    <span class="keyword">def</span> __div__(self, autre):<br><span class="newlinenumber"> 25 </span>        num = self.num * autre.denom<br><span class="newlinenumber"> 26 </span>        denom = self.denom * autre.num<br><span class="newlinenumber"> 27 </span><span class="keyword">        return</span> Fraction(num, denom)<br><br><span class="linenumber"> 38 </span><span class="keyword">if</span> __name__ ==<span class="string"> "__main__"</span>:<br><span class="linenumber"> 39 </span>    a = Fraction(<span class="number">1</span>,<span class="number"> 2</span>)<br><span class="linenumber"> 40 </span>    b = Fraction(<span class="number">3</span>,<span class="number"> 1</span>)<br><span class="linenumber"> 41 </span><span class="keyword">    assert</span> str(a) ==<span class="string"> "(1/2)"</span><br><br><span class="linenumber"> 42 </span><span class="keyword">    assert</span> str(b) ==<span class="string"> "(3)"</span><br><span class="linenumber"> 43 </span><span class="keyword">    assert</span> str(a*b) ==<span class="string"> "(3/2)"</span><br><br><span class="linenumber"> 44 </span>    c = Fraction(<span class="number">1</span>,<span class="number"> 3</span>)<br><span class="linenumber"> 45 </span><span class="keyword">    assert</span> str(b*c) ==<span class="string"> "(1)"</span><br><br><span class="linenumber"> 46 </span>    d = Fraction(<span class="number">5</span>,<span class="number"> 10</span>)<br><span class="linenumber"> 47 </span><span class="keyword">    assert</span> str(d) ==<span class="string"> "(1/2)"</span><br><br><span class="newlinenumber"> 48 </span><span class="keyword">    print</span> a/b<br><span class="newlinenumber"> 49 </span><span class="keyword">    print</span> a/a<br></pre>

<p>Le résultat est<br>
</p>

<pre>(1/6)<br>(1)<br></pre>


<p>comme désiré. Tout ce qu'il nous reste à faire est de convertir les instructions <span class="pykeyword">print</span> [lignes 48 et 49] en instructions <span class="pykeyword">assert</span> et nous serons prêts à continuer.</p>

<!--=============================================-->
<hr width="50%">
<h3 class="section">Addition et soustraction</h3>

<p>Ce que nous voulons faire ensuite est d'additionner et soustraire
des fractions. Nous commencerons avec l'addition. Cependant, cette fois
nous procéderons différemment : nous commencerons d'abord par utiliser <span class="pykeyword">assert</span>
pour exprimer les résultats auxquels nous nous attendrions si Python
savait comment additionner deux fractions. Bien sûr, cela échouera en
levant une exception. Nous reviendrons alors en arrière, écrirons le
code nécessaire pour
que les tests fonctionnent.</p>


<p>Cette approche est connue sous le nom de <i>Développement guidé par les tests (Test driven development)</i>.
C'est une manière moderne utilisée en programmation qui est de plus en
plus populaire car elle aide vraiment à empêcher l'apparition de bugs.</p>

<pre><span class="linenumber"> 38 </span><span class="keyword">if</span> __name__ ==<span class="string"> "__main__"</span>:<br><span class="linenumber"> 39 </span>    a = Fraction(<span class="number">1</span>,<span class="number"> 2</span>)<br><span class="linenumber"> 40 </span>    b = Fraction(<span class="number">3</span>,<span class="number"> 1</span>)<br><span class="linenumber"> 41 </span><span class="keyword">    assert</span> str(a) ==<span class="string"> "(1/2)"</span><br><br><span class="linenumber"> 42 </span><span class="keyword">    assert</span> str(b) ==<span class="string"> "(3)"</span><br><span class="linenumber"> 43 </span><span class="keyword">    assert</span> str(a*b) ==<span class="string"> "(3/2)"</span><br><br><span class="linenumber"> 44 </span>    c = Fraction(<span class="number">1</span>,<span class="number"> 3</span>)<br><span class="linenumber"> 45 </span><span class="keyword">    assert</span> str(b*c) ==<span class="string"> "(1)"</span><br><br><span class="linenumber"> 46 </span>    d = Fraction(<span class="number">5</span>,<span class="number"> 10</span>)<br><span class="linenumber"> 47 </span><span class="keyword">    assert</span> str(d) ==<span class="string"> "(1/2)"</span><br><br><span class="linenumber"> 48 </span><span class="keyword">    assert</span> str(a/b) ==<span class="string"> "(1/6)"</span><br><span class="linenumber"> 49 </span><span class="keyword">    assert</span> str(a/a) ==<span class="string"> "(1)"</span><br><br><span class="newlinenumber"> 50 </span><span class="keyword">    assert</span> str(a+a) ==<span class="string"> "(1)"</span><br><span class="newlinenumber"> 51 </span><span class="keyword">    assert</span> str(b+b) ==<span class="string"> "(6)"</span><br><br><span class="newlinenumber"> 52 </span><span class="keyword">    assert</span> str(a+b) ==<span class="string"> "(7/2)"</span><br><span class="newlinenumber"> 53 </span><span class="keyword">    assert</span> str(c+c) ==<span class="string"> "(2/3)"</span><br><br></pre>

<p>Et voici l'ajout nécessaire à la <span class="pykeyword">class</span>e <tt>Fraction </tt>:</p>

<pre><span class="newlinenumber"> 29 </span>    <span class="keyword">def</span> __add__(self, other):<br><span class="newlinenumber"> 30 </span>        denom = self.denom * other.denom<br><span class="newlinenumber"> 31 </span>        num = self.num*other.denom + self.denom*other.num<br><span class="newlinenumber"> 32 </span><span class="keyword">        return</span> Fraction(num, denom)<br></pre>


<p>Essayez !</p>

<!--=============================================-->
<hr width="50%">
<h3 class="try">À votre tour</h3>

<p>Vous devriez maintenant être capable de faire faire à Python la soustraction de deux fractions.  Utilisez <tt>__sub__()</tt>, et vérifiez vos résultats!</p>

<!--=============================================-->
<hr width="50%">
<h3 class="section">1 + 1 = ?</h3>

<p>Avant de passer à la leçon suivante, essayez ce qui suit :</p>

<pre>un = Fraction(1)<br><span class="keyword">print</span> un + 1<br></pre>

<center><a href="fractions2.htm"><img alt="précédent" src="../../images/previous.png"> Fractions - 2e partie </a> - <a href="../lessons_toc.htm"><img alt="début" src="../../images/home.png"></a>

- <a href="fractions4.htm">Fractions - 4e partie <img alt="suivant" src="../../images/next.png"></a></center>
</body></html>